package com.qf.kdxf.controller;

import com.qf.kdxf.service.impl.TextIdentifyServiceImpl;
import com.qf.kdxf.util.common.FileUtil;
import com.qf.kdxf.util.common.HttpUtil;
import com.qf.kdxf.util.common.UploadFile;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @Author 明廷盛
 * @Date 2025/6/11 15:12
 * @Description
 */
// 声明这是一个Spring MVC控制器
@Controller
// 设置控制器的基础路由路径为"/textidentify"
@RequestMapping("/textidentify")
public class TextIdentifyController {

    // 自动注入文字识别服务实现类
    @Autowired
    private TextIdentifyServiceImpl textIdentifyService;

    /**
     * 01-手写文字识别功能(对接科大讯飞文字识别API的手写识别服务)
     * @param file 客户端上传的包含手写文字的图片文件
     * @param request HTTP请求对象
     * @return 返回识别结果的JSON字符串
     */
    @RequestMapping("/handwritten")  // 映射"/textidentify/handwritten"路径的请求
    @ResponseBody  // 表示直接返回数据到响应体，不经过视图解析器
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request){

        // 初始化识别结果变量
        String result = null;

        try {
            // 获取服务器上webapp目录的真实路径
            String path = request.getServletContext().getRealPath("/");

            // 调用文件上传工具类，保存上传的图片到服务器临时目录
            String filePath = UploadFile.upload(file,path);

            // 构造调用讯飞API所需的请求头参数
            // 参数说明："en"表示英文识别，"false"表示不返回文本坐标
            Map<String, String> header = textIdentifyService.constructHeader("en", "false");

            // 将图片文件读取为字节数组
            byte[] imageByteArray = FileUtil.read2ByteArray(filePath);

            // 将图片字节数组进行Base64编码，转换为字符串
            String imageBase64 = new String(Base64.encodeBase64(imageByteArray), "UTF-8");

            // 构造API请求的body参数，格式为"image=[Base64图片数据]"
            String bodyParam = "image=" + imageBase64;

            // 调用HTTP工具类，向讯飞手写识别API发送POST请求
            // API地址：讯飞手写文字识别服务端点
            result = HttpUtil.doPost("http://webapi.xfyun.cn/v1/service/v1/ocr/handwriting", header, bodyParam);

            // 打印识别结果到控制台（调试用）
            System.out.println("识别结果：" + result);

        } catch (Exception e) {
            // 捕获并处理所有可能出现的异常
            System.out.println("手写文字识别过程中发生异常：" + e.getMessage());
            e.printStackTrace();  // 打印异常堆栈
        }

        // 返回识别结果（如果失败则返回null）
        return result;
    }
}
